package cn.tedu.v1_2;

import java.io.*;
import java.net.BindException;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketException;

/**
 * 聊天室Version1.1
 * 服务器 功能：1.服务器申请端口号：软件具备端口号
 *            2.在start方法中：等待客户链接，返回socket
 *                          IO读入
 *     【新增】3.所有服务器端的异常，全面捕获明确提示
 *            4.关闭severSocket
 *            5.知道对方IP
 * 测试：自己连接自己  测试
 *      别人链接自己  知道对方IP
 */
public class Server {
    //1.创建服务器端套接字Socket
    private ServerSocket serverSocket;
    //2.创建构造器---创建端口号：6666
    public Server(){
        try {serverSocket=new ServerSocket(1628);

        } catch (BindException e) {
            System.out.println("请检查端口号，被占用");
        }
        catch (IOException e) {
            System.out.println("客户端没有链接上");
        }
    }

    //3.创建 start 方法accept（）等待客户端连接！传输数据：IO
    public  void start()  {

        //客户端链接服务器端--accept，返回socket对象IO流
        InputStream is=null;//低级流--读入
        //OutputStream os=socket.getOutputStream();
        //高级流--转换流，目的：指定编码集：UTF8
        InputStreamReader isr=null;
        //OutputStreamWriter osw=new OutputStreamWriter(os);
        //高级流--缓冲输入流
        BufferedReader br=null;
        //BufferedWriter bw=new BufferedWriter(osw);
        //PrintWriter pw=new PrintWriter(bw);
        Socket socket=null;
        try {
            System.out.println("等待客户端连接");
            socket =serverSocket.accept();
            //getInetAddress()返回Address对象，表示远方IP
            //具体IP地址 getHostAddress，将远方IP地址转换为字符串
            //未连接上返回null
            String ip=socket.getInetAddress().getHostAddress();
            System.out.println("客户端："+ip+"连接上了");
            System.out.println("一个客户端连接上了");

            is=socket.getInputStream();
            isr=new InputStreamReader(is,"UTF8");
            br=new BufferedReader(isr);


            //服务器端：一直读
            while (true){
                String str=br.readLine();//获取一行字符串，交给str
                System.out.println("客户端："+str);//打印客户端发过来文本

            }
//            while (true){
//                String say=input.nextLine();
//                pw.println(say);
//                System.out.println("写出完毕");
//            }
        } catch (UnsupportedEncodingException e) {
            System.out.println("请检查客户端/服务器端编码集：不一致");
        }catch (SocketException e){
            System.out.println("客户端链接被重置");
        }
        catch (IOException e) {
            System.out.println("客户端链接失效");
        } finally {
            //关闭流  关闭socket
            if (br!=null)
                try {
                    br.close();
                } catch (IOException e) {
                    System.out.println("读入流断开连接");
                }
            try {
                socket.close();
            } catch (IOException e) {
                System.out.println("客户端socket断开连接");
            }

        }
    }
    //4.创建主方法---服务器程序启动
    public static void main(String[] args)  {
        //执行：先创建Server类-->调用空参构造器-->申请端口号：6666
        Server server=new Server();
        //执行：然后调用start方法--->等待客户端连接操作---进行IO流
        server.start();
    }

}
